<?php
/**
 * 
 * 回调基础类
 * @author widyhu
 *
 */
namespace App\Libs\WxApp;

//use App\Libs\WxPayNotifyReply;

use App\Libs\Log;
use App\Models\OrderList;
use App\Models\Student;
use App\Models\Subscribe;
use App\Libs\WxApp\WxPayApi;

class WxPayNotify extends WxPayNotifyReply
{
	/**
	 * 
	 * 回调入口
	 * @param bool $needSign  是否需要签名输出
	 */
	final public function Handle($needSign = true)
	{
		$msg = "OK";
		//当返回false的时候，表示notify中调用NotifyCallBack回调失败获取签名校验失败，此时直接回复失败
		$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);
		if($result == false){
			$this->SetReturn_code("FAIL");
			$this->SetReturn_msg($msg);
			$this->ReplyNotify(false);
			return;
		} else {
			//该分支在成功回调到NotifyCallBack方法，处理完成之后流程
			$this->SetReturn_code("SUCCESS");
			$this->SetReturn_msg("OK");
		}
		$this->ReplyNotify($needSign);
	}
	
	/**
	 * 
	 * 回调方法入口，子类可重写该方法
	 * 注意：
	 * 1、微信回调超时时间为2s，建议用户使用异步处理流程，确认成功之后立刻回复微信服务器
	 * 2、微信服务器在调用失败或者接到回包为非确认包的时候，会发起重试，需确保你的回调是可以重入
	 * @param array $data 回调解释出的参数
	 * @param string $msg 如果回调处理失败，可以将错误信息输出到该方法
	 * @return true回调出来完成不需要继续回调，false回调处理未完成需要继续回调
	 */
	public function NotifyProcess($data, &$msg)
	{
		$log = Log::get('pay_logs');
		$log->addInfo('wx_video_pay'.json_encode($data));

		if($data['return_code'] != 'SUCCESS') {
			return false;
		}else if ($data['return_code'] == 'SUCCESS') {

			$order_info = OrderList::where(['ordid'=>$data['out_trade_no']])->first();//查找当前订单信息

			$log->addInfo('wx_video_pay_order_info'.json_encode($order_info));
			if($order_info->ordstatus == 0){
				//进行订单处理，并传送从微信返回的参数；
				$ord_data['payment_type']            	= 'weixin';
				$ord_data['payment_trade_no']        	= $data['transaction_id'];
				$ord_data['payment_trade_status']  	= $data['return_code'];
				$ord_data['payment_notify_id']     	= '';
				$ord_data['payment_notify_time']   	= date('Y-m-d H:i:s');
				$ord_data['payment_buyer_email']   	= '';
				$ord_data['ordstatus']             	= 1;

				OrderList::where(['ordid'=>$data['out_trade_no']])->update($ord_data);

				if($data['attach'] == 'video_pay'){

					//修改学员视频支付状态
					$rs = Student::where(['id'=>$order_info->userid])->update(['video_pay'=>1]);
				}elseif($data['attach'] == 'subscribe_pay'){

					//修改预约支付状态
					$rs = Subscribe::where(['id' => $order_info->productid])->update(['paystatus' => 1]);
				}

				if(!$rs){
					return false;
				}

			}

			return true;
		}
	}
	
	/**
	 * 
	 * notify回调方法，该方法中需要赋值需要输出的参数,不可重写
	 * @param array $data
	 * @return true回调出来完成不需要继续回调，false回调处理未完成需要继续回调
	 */
	final public function NotifyCallBack($data)
	{
		$msg = "OK";
		$result = $this->NotifyProcess($data, $msg);
		
		if($result == true){
			$this->SetReturn_code("SUCCESS");
			$this->SetReturn_msg("OK");
		} else {
			$this->SetReturn_code("FAIL");
			$this->SetReturn_msg($msg);
		}
		return $result;
	}
	
	/**
	 * 
	 * 回复通知
	 * @param bool $needSign 是否需要签名输出
	 */
	final private function ReplyNotify($needSign = true)
	{
		//如果需要签名
		if($needSign == true && 
			$this->GetReturn_code() == "SUCCESS")
		{
			$this->SetSign();
		}
		WxpayApi::replyNotify($this->ToXml());
	}
}